/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-03-16     Hao       the first version
 */
#include <tool/vofa.h>

#define VOFA_UART_NAME   "uart3"            // 串口设备名称
static rt_device_t vofa_uart;               // 串口设备句柄

// 数据帧帧尾
static uint8_t tail[4] = { 0x00, 0x00, 0x80, 0x7f };

// 发送的结构体
typedef union
{
    float fdata;            // 占四个字节
    unsigned long ldata;    // 占四个字节
} FloatLongType;

int vofo_uart_init(void)
{
    vofa_uart = rt_device_find(VOFA_UART_NAME);
    RT_ASSERT(vofa_uart != RT_NULL);

    // 以DMA接收及轮询发送方式打开串口设备
    rt_device_open(vofa_uart, RT_DEVICE_FLAG_DMA_RX);

    return 0;
}
INIT_APP_EXPORT(vofo_uart_init);

/**
 * @brief   把一个float数据转换为uint8_t数组
 *
 * @param   fnum        需要转换的数
 * @param   uarray      存储转换结果的数组
 *
 * @return  none
 */
static void float2uint8(float fnum, uint8_t *uarray)
{
    uint8_t x;

    FloatLongType data;

    data.fdata = fnum;

    for (x = 0; x < 4; x++)
    {
        uarray[x] = (uint8_t) (data.ldata >> (x * 8));
    }
}

/**
 * @brief   使用JustFloat的格式给上位机发送数据
 *
 * @param   fdata       存储有需要发送的数据的数组
 * @param   fdata_num   需要发送的数据长度（几个数）
 *
 * @return  none
 */
void vofa_justfloat_send(float *fdata, uint16_t fdata_num)
{
    uint16_t x;
    uint8_t y;
    uint8_t u_data[4];

    // 循环多次发送数据
    for (x = 0; x < fdata_num; x++)
    {
        // 把需要发送的数据转换格式
        float2uint8(fdata[x], u_data);
        // 按字节发送
        for (y = 0; y < 4; y++)
        {
            rt_device_write(vofa_uart, 0, &u_data[y], 1);
        }
    }

    // 发送数据帧帧尾
    for (y = 0; y < 4; y++)
    {
        rt_device_write(vofa_uart, 0, &tail[y], 1);
    }
}
